package problem4;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

/*
 * Singleton - es gibt nur eine Instanz von Balance	
 */
public class Balance {

	private static Balance instance = new Balance();

	private Balance() {

	}

	public static Balance getInstance() {
		return instance;
	}

	// Hashmap zur Speicherung von ID und Umsatz der Kassen
	private ConcurrentHashMap<Integer, Double> storage = new ConcurrentHashMap<Integer, Double>();

	public synchronized void setEntry(int cashpointId) {
		// Erhöhe den Umsatz der Kasse mit der gegebenen ID um eine zufällige double-Zahl > 0
		Random random = new Random();
		double value = random.nextDouble() + 0.01;

		try {
			value += storage.get(cashpointId); // aktuellen Umsatz zu bisherigem hinzu addieren
		} catch (NullPointerException e) {
		}
		value = Math.round(value * 100.) / 100.; // Auf zwei Nachkommastellen runden

		storage.put(cashpointId, value);
		sortList(); // Höchster Bilanzwert nach vorne
	}

	/*
	 * Sortiert die Bilanz pro Kasse absteigend
	 */
	private void sortList() {

		List<Entry<Integer, Double>> balance = new ArrayList<Entry<Integer, Double>>();
		balance.addAll(storage.entrySet()); // Hashmap-Inhalt zum Sortieren in Liste speichern

		Collections.sort(balance, new Comparator<Entry<Integer, Double>>() {
			@Override
			public int compare(Entry<Integer, Double> o1, Entry<Integer, Double> o2) {

				return o2.getValue().compareTo(o1.getValue());
			}

		});

		// Bilanz jeder Kasse ausgeben
		System.out.print("Bilanz: ");
		for (int i = 0; i < balance.size(); i++) {
			System.out.print("Kasse " + balance.get(i).getKey() + ": " + balance.get(i).getValue()
					+ "€   ");
		}
		System.out.println("");

	}
	
	

}
